package cn.zyl.common.redis.handler;

import cn.zyl.common.redis.exception.RedisBaseException;
import cn.zyl.demo.common.boot.beans.ResBody;
import cn.zyl.demo.common.boot.enums.ResCodeEnum;
import cn.zyl.demo.common.boot.tools.ResBodyTool;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.Objects;

/**
 * AdviceRedisExceptionHandler类说明: 异常拦截处理器
 *
 * @author wsz
 * @version v1.0
 * @date 2020-08-04
 */
@RestControllerAdvice
public class AdviceRedisExceptionHandler {
    /**
     * post请求参数校验抛出的异常（当带注释的参数验证抛出异常@Valid失败
     * @param e 异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResBody<String> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
        String defaultMessage = Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage();
        return ResBodyTool.error(ResCodeEnum.ERROR, defaultMessage);
    }
    /**
     * get请求参数校验抛出的异常（当被认为是绑定错误是致命抛出。 实现了BindingResult接口（其超级接口Errors ），以允许绑定错误的直接分析。
     * @param e 异常
     */
    @ExceptionHandler(BindException.class)
    public ResBody<String> bindExceptionHandler(BindException e){
        String defaultMessage = Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage();
        return ResBodyTool.error(ResCodeEnum.ERROR, defaultMessage);
    }

    /**
     * 通过抛出HttpMessageConverter实现当HttpMessageConverter.read方法失败
     * @param e 异常
     * @return 响应
     */
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public ResBody<String> httpMessageNotReadableExceptionHandler(HttpMessageNotReadableException e){
        String defaultMessage = e.getMessage();
        return ResBodyTool.error(ResCodeEnum.ERROR, defaultMessage);
    }
    @ExceptionHandler(RedisBaseException.class)
    public ResBody<String> redisBaseExceptionHandler(RedisBaseException e){
        String defaultMessage = e.getMessage();
        return ResBodyTool.error(ResCodeEnum.ERROR, defaultMessage);
    }
}
